package models.PokerTP;

//import java.util.prefs.BackingStoreException;


public class Player implements Comparable<Player> {
	protected Card[] karty;
	protected int [] wartosci;
	protected int [] wartosci2;
	private boolean kolor = true ;
	private boolean strit = true;
	public int cash = 0;
	private int para1=-1,para2=-1;
	private int p1=1,p2=1;
	private int temp=0;
	protected Deck talia;
	protected String nazwa = "";
	
	public Player(){
		wartosci = new int[6];
		wartosci2 = new int[6];
	}
	public Player(Deck a) throws NullPointerException 
	{
		if(a == null) throw new NullPointerException("Talia nie moze byc null.");
		
		karty = new Card[5];
		wartosci = new int[6];
		wartosci2=new int[6];
		//rozdaje karty i tablice z wartosciami kart 
        for (int i=0; i<5; i++){
            karty[i] = a.wypiszzTali();
           // System.out.println("----    "+wartosci2[i]);
            
        }
        
        talia = a;
      //  karty[0].war(1,4);
     //   karty[1].war(2,4);
       // karty[2].war(2,2);
      // karty[3].war(2,2);
       // karty[4].war(2,11);

      	
	}
	
	//wyswietla wyniki 
	String wynik(int[] w){
		String s="";
		 switch(w[5]){ 
		 	case 0:s=("Nazwy�sza karta: "+ karty[0].wartoscNapis(w[4]));
		 		break;
		 	case 1:s=("Para: "+karty[0].wartoscNapis(w[4]));
		 		break;
		 	case 2:s=("Dwie Pary: "+karty[0].wartoscNapis(w[4])+" i "+karty[0].wartoscNapis(w[2]));
		 		break;
		 	case 3:s=("Tr�jka: "+karty[0].wartoscNapis(w[4]));
		 		break;
		 	case 4:s=("Strit ");
		 		break;
		 	case 5:s=("Kolor ");
		 		break;
		 	case 6:s=("Ful: "+karty[0].wartoscNapis(w[4])+" na "+karty[0].wartoscNapis(w[1]));
		 		break;
		 	case 7:s=("Czw�rka: "+karty[0].wartoscNapis(w[4]));
		 		break;
		 	case 8:s=("Poker ");
		 		break;
		 }	
		 return s;
	}
	//sprawdza czy gracz posiada jakies kombinacje kart 
	String zamianaKart(){
		p1=1;p2=1;para1=-1;para2=-1;kolor=true;strit=true;
		for(int i=0;i<5;i++){
			wartosci2[i]=0;
			wartosci[i]=karty[i].pobiezWartosc();
	    	   //System.out.println(karty[i]+"    "+wartosci2[i]);
		}
	        //sparawdza czy kolor 
	        for(int i=0;i<4;i++){
	        	if(karty[i].pobiezKolor() !=karty[i+1].pobiezKolor() ){
	        		kolor = false ;
	        	}
	        }
	        //sortowanie
	        for(int j=0;j<4;j++){
	        	for(int i=0;i<4;i++){
	        		if(wartosci[i]>wartosci[i+1]){
	        			temp=wartosci[i];
	        			wartosci[i]=wartosci[i+1];
	        			wartosci[i+1]=temp;
	        		}
	        	}
	        }
	        //czy strit
	        for(int i=0;i<4;i++){
	        	if(wartosci[i+1]-wartosci[i]!=1){
	        		strit = false ;
	        	}
	        }
	        
	        //para 2 pary itd
	        int q=4;
	        for(int i=4;i>0;i--){
	        	if(wartosci[i]==wartosci[i-1]){
	    			if(p1==1||para1==wartosci[i]){
	    				p1++;
	    				para1=wartosci[i];
	    				if(p1==2){   					
	    					wartosci2[q]=wartosci[i];
	    					q--;
	    					wartosci2[q]=wartosci[i-1];	
	    				}else{
	    					q--;
	    					wartosci2[q]=wartosci[i-1];
	    				}
	    			}else if(p2==1||para2==wartosci[i]){
	    				p2++;
	    				para2=wartosci[i];
	    				if(p2==2){
	    					q--;
	    					wartosci2[q]=wartosci[i];
	    					q--;
	    					wartosci2[q]=wartosci[i-1];	
	    				}else{
	    					q--;
	    					wartosci2[q]=wartosci[i-1];
	    				}
	    			}
	        	}
	    		
	        }
	        	//System.out.println(p1+"             "+para1);
	        	//System.out.println(p2+"             "+para2);
	        
	        
	        //System.out.println(kolor);
	        //sprawdzanie warto�ci
	        if(p1==1&&p2==1){
	        	wartosci2[5]=0;
	        	wartosci2=wartosci;
	        }
	        if(p1==2||p2==2){
	        	wartosci2[5]=1;
	        }
	        if(p1==2&&p2==2){
	        	wartosci2[5]=2;
	        }
	        if(p1==3||p2==3){
	        	wartosci2[5]=3;
	        }
	        if(strit){
	        	wartosci2[5]=4;
	        }
	        if(kolor){
	        	wartosci2[5]=5;
	        }
	        if((p1==3&&p2==2)||(p1==2&&p2==3)){
	        	wartosci2[5]=6;
	        }
	        if(p1==4||p2==4){
	        	wartosci2[5]=7;
	        }
	        if(strit&&kolor){
	        	wartosci2[5]=8;
	        }
	       return wynik(wartosci2);
	}
	void wyswietl(){
        for (int i=0; i<5; i++)
            System.out.println(karty[i]);
    }
	void zmien(int k,Deck a){
		if(k<1||k>5)
			return;
		karty[k-1]=null;
		karty[k-1]=a.wypiszzTali();

	}
	
	public void zmien(int k) throws Blad
	{
		if(k<1||k>5)
			throw new Blad("Podano numer karty (" + Integer.toString(k) + ") spoza przedzia�u [1;5].");
		karty[k-1]=null;
		karty[k-1]=talia.wypiszzTali();
	}
	
	public int compareTo(Player that){
		//sprawdza kombinacja
        for (int i=5; i>=0; i--) {
            if (this.wartosci2[i]>that.wartosci2[i]){
                return 1;
            }else if (this.wartosci2[i]<that.wartosci2[i]){
                return -1;
            }
        }
        //sprawdza karty
       for (int i=5; i>=0; i--) { 
    	   if (this.wartosci[i]>that.wartosci[i]){
               return 1;
           }else if (this.wartosci[i]<that.wartosci[i]){
               return -1;
           }
       }
       return 0;
	}
	
	public void ustawReke(Card[] reka) throws Blad
	{
		if(reka == null || reka.length != 5)
			throw new Blad("Przekazana niepoprawna ilosc kart.");
		
		karty = reka;
	}
	
	public void ustawTalie(Deck talia) throws NullPointerException
	{
		if(talia == null) throw new NullPointerException("Referencja do talii nie moze byc null.");
		this.talia = talia;
	}
	
	public void wykonajSwojRuch() throws NullPointerException
	{
		if(karty == null || talia == null)
			throw new NullPointerException("Reka gracza lub talia, z ktorej czerpie nie moze byc null.");
		
		// naglowek:
		System.out.println(String.format("----------------------- %s -----------------------", nazwa));
	}
	
	public String licytuj(){return "a";};
	public int ile(){
        return 100;
    }    
	
	
	public void setNazwa(String nazwa)
	{
		this.nazwa = nazwa;
	}
	
	public String getNazwa()
	{
		return nazwa;
	}
	
	@Override
	public String toString() {
		return nazwa;
	}
	
	public void changeCard(int cardNumber, Card newCard) {
		karty[cardNumber] = newCard;
	}
}
